票房遇冷的春节档口碑冠军丨《狙击手》影评分析
本文作者:温和铭,中南财经政法大学统计与数学学院
本文编辑:谭 可
技术总编:戴 雯
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程、Stata基础课程、Stata进阶课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~
第一步:爬取影评基本信息
clear
cap mkdir "D:/douban" //创建目标文件夹
cd "D:/douban" //将当前工作路径更改为此文件夹
*****第一步:爬取影评基本信息*****
local p=5 //豆瓣每页显示20条影评,共有82条影评,需要爬取5页
set more off
forvalues i = 1/`p'{
local j=(`i'-1)*20 //定义影评对应的数字编码
di `j'
cap copy"https://movie.douban.com/subject/35215390/reviews?start=`j'" temp.txt,replace //拷贝网页链接
infix strL v 1-100000 using temp.txt,clear //读入数据
preserve //起死回生命令,保留源代码,以便接下来提取影评链接和标题
keep if index(v, `"<span content=""')
replace v = ustrregexra(v,"<.*?>","") //利用正则表达式懒惰模式,把<>里的内容替换为空
rename v time
save time.dta ,replace //储存影评时间
restore
keep if index(v,`"<h2><a href="')
split v,p(`"""') //用双引号作为分隔符分割
rename v2 url
split v3,p(">")
split v32,p("<")
rename v321 title
keep url title //储存影评的链接和标题
merge using time //横向合并
drop _merge
save "影评`i'.dta",replace //第i页影评对应的url、title、time保存为影评i.dta
}
到这里,我们的目标文件夹里应该出现了五个含有影评信息的dta文件,接下来使用append将它们合并成一个完整的文件:
clear
local files:dir "." file "影评*.dta"
foreach file in `files'{
append using "`file'" //把上面生成的影评i.dta合并起来
}
save "影评.dta",replace
sort
发现(见下图),数据存在一些重复,可能是之前爬取过程中断后重新又爬了几遍,这个时候需要进行数据清洗,去掉重复部分。*删除重复影评,每一个url只保留一个记录
sort url //按url进行排序
by url: gen filter=_n //对相同url的数据从1到最后一条编号
keep if filter==1 //只保留第一条
save "去重影评.dta", replace
drop filter
去掉编号变量。第二步:爬取影评源代码
use "去重影评.dta",clear
gen v=""
set more off
forvalues i=1/`=_N'{
replace v=fileread(url) in `i' //把网页源代码拷贝到v中
while filereaderror(v[`i'])!=0 {
sleep `=int(runiform()*5000+5000)' //随机休息5-10秒
replace v=fileread(url) in `i'
}
sleep `=int(runiform()*5000+5000)' //随机休息5-10秒
}
save "影评源代码.dta",replace
sleep
语句,让程序在相邻的两次爬取之间休息一会儿。最终得到的含有源代码(即变量v)的数据如下图:第三步:从源代码中提取评分和影评内容
use 影评源代码.dta,clear
* 提取评分
gen score=ustrregexs(1) if ustrregexm(v,"allstar([0-9]{2})")
destring score,replace
replace score=score/10
* 提取影评内容
split v,p(`"<div id="link-report">"' `"<div class="main-author">"')
replace v2 = ustrregexra(v2,"\s","",.)
replace v2 = ustrregexra(v2, "<.*?>", "",.)
replace v2=ustrregexra(v2," |-|;","")
rename v2 content
*保存数据
keep title score content
save "影评及信息.dta",replace
评分分析
use 影评及信息.dta,replace
drop if score==. //删除没有给出评分的影评
gen 评价 = ""
replace 评价 = "好评" if score > 3
replace 评价 = "中评" if score == 3
replace 评价 = "差评" if score < 3
collapse (count) score,by(评价) //分组统计评分数量
egen total=sum(score) //计算评分的总数
gen fre=score/total
grstyle init //初始化图形设置
grstyle set plain //去掉图形背景色
graph pie fre ,over(评价) pie(5,explode color(navy *0.8)) plabel(_all percent ,size(*1) color(white))
内容分析
*导出为txt文档
set more off
cd D:\douban
use 影评及信息.dta,clear
keep content
export delimited using content.txt,replace
*调用Python分词
clear all
python
import jieba.posseg
word=[]
with open(r"content.txt",encoding="utf8") as f:
for i in f.readlines():
str=i
word.append(str)
jieba.load_userdict(r"dict.txt") #添加自定义词典
with open("分词.txt","w",encoding="utf8") as f2:
for unit in word:
seg_list = jieba.posseg.cut(unit)
for word in seg_list:
f2.write(word.word+" "+word.flag+"\n")
end
*分词结果导入Stata,并删除单字、缺失值、停用词
import delimited using 分词.txt, clear encoding("utf-8")
split v1,p(" ")
drop v1
rename (v11 v12) (keyword flag)
drop if ustrlen(keyword) == 1 // 删除单字
drop if keyword =="" //删除缺失值
preserve
import delimited using 停用词表.txt, clear ///
encoding("utf-8") varname(nonames)
outsheet using 停用词表.txt, replace nonames noquote
levelsof v1, local(keyword)
restore
foreach word in `keyword' {
drop if keyword == "`word'" //删除停用词
}
*词频统计
bysort keyword: gen frequency = _N
gsort -frequency
duplicates drop
save wordfre,replace
wordcloud
命令绘制词云图,在一个html网页中直观展示所有评论者都在影评中重点写了哪些内容:*绘制词云图
clear
cd D:\douban
use wordfre,clear
keep if ustrregexm(flag, "^[anv]")
keep in 1/200
wordcloud keyword frequency using 词云.html, replace size(15 80) range(3840 2160)
shellout 词云.html
腾讯课堂课程二维码
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
学习丰县,营造良好营商环境!
大国丢娃图:从川渝到徐州!
丰县“失火”,殃及徐州:股市超跌近30亿!
Unicode转义字符——编码与解码
徐州!徐州!
B站弹幕爬虫——冬奥顶流冰墩墩&雪容融
不会用Stata做描述性统计表?so easy!
丰沛之地:备足姨妈巾
过年啦,用Python绘制一幅属于你的春联吧!
登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅【基础篇】查找并输出子字符串的定位
Stata中的小清新命令——添加观测值
PCA(主成分分析法)降维——Python实现
超好用的事件研究法
如何绘制任泽平《鼓励生育基金》的几幅图
Python 第六天——字符串
findname——想要什么找什么
Python字符串之“分分合合”
PDF转docx可批量操作?——wordconvert的小技巧
考研之后,文科生需以“do”躬“do”!
手绘五星兴家国——用Stata绘制五星红旗
Seminar丨董事会的性别多样化和企业创新:来自国际的证据Python与数据库交互——窗口函数
Stata之post命令——数据邮递爬虫俱乐部成员的Stata学习经验分享来啦!
Seminar丨2002年萨班斯·奥克斯利法案的经济后果我几乎画出了“隔壁三哥”家的国旗
Python基础——三大数字类型,你都了解吗?如何用Stata绘制带指向性箭头标注的图像
Seminar丨荐仆贷款——19世纪中国的信任辅助贷款 【技能篇】多进程队列间通信
Seminar丨公司董事会的人才增长:来自中国的证据
正则表达式--懒惰模式
爬完独立董事的年薪,我的眼镜跌破了!识别旅游“照骗”——看风景名胜是否名副其实关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。